package com.syedu.day12;

/**
 * description：外部类
 * @author Administrator
 * @date 2022/3/31 9:06
 */
public class Outer {
    //外部类的普通属性
    private int id = 1;
    //外部类的静态属性
    private static int guid = 10;

    /**
     * 成员内部类,把内部类当做外部类的一个成员(属性或者方法)看待
     */
    //public class MemberInnerClass {
    private class MemberInnerClass {
        //内部类的普通属性
        private int id = 2;

        /**
         * JDK14-17开始支持内部类静态属性的使用!!!
         */
        //内部类的静态属性
        //private static int guid = 20;

        //内部类的方法
        public void memberInnerMethod() {
            System.out.println(id);
            System.out.println(guid);

            //注意: 内部类可以直接访问外部类的成员
            //System.out.println(outerId);
            //System.out.println(outerGuid);

            //如果内部类属性和外部类属性同名,则访问时,直接访问的是内部类的属性,
            //要访问外部类的属性,则需要如下写法
            System.out.println(Outer.this.id);
            System.out.println(Outer.guid);
        }
    }

    /**
     * 外部类方法,作用是创建成员内部类对象,并且调用方法
     */
    public void outerMethod() {
        //创建成员内部类对象
        MemberInnerClass memberInnerClass = new MemberInnerClass();
        //调用内部类方法
        memberInnerClass.memberInnerMethod();
    }

    /**
     * 静态内部类,把内部类当做是外部类的静态成员,它相当于静态的成员内部类
     */
    public static class StaticInnerClass {
        private int id = 3;
        private static int guid = 30;

        public void staticInnerMethod() {
            System.out.println(id);
            System.out.println(guid);

            //注意: 静态内部类可以访问外部类的静态成员!!!
            //System.out.println(Outer.this.id);
            System.out.println(Outer.guid);
        }
    }

    /**
     * 局部内部类,定义在外部类的方法中
     */
    public void outerMethod2() {
        class LocalInnerClass {
            private int id = 4;
            //private static int guid = 40;

            public void localInnerMethod() {
                System.out.println(id);
                System.out.println(guid);

                System.out.println(Outer.this.id);
                System.out.println(Outer.guid);
            }
        }
        //创建局部内部类对象,并且调用方法
        LocalInnerClass lic = new LocalInnerClass();
        lic.localInnerMethod();
    }

    /**
     * 匿名内部类,没有名字的局部内部类
     */
    public void outerMethod3() {
        new Inner() {
            private int id = 4;
            //private static int guid = 40;

            @Override
            public void method() {
                System.out.println(id);
                System.out.println(guid);

                System.out.println(Outer.this.id);
                //System.out.println(Outer.guid);
            }
        }.method();
    }
}

interface Inner {
    void method();
}